/*-------------------------------------------------------------------------
 *
 * parser.h
 *		"原始"解析器的定义（仅限 flex 和 bison 阶段）
 *
 * 这是原始词法分析/解析函数的外部 API。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/parser/parser.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef PARSER_H
#define PARSER_H

#include "nodes/parsenodes.h"


/*
 * RawParseMode决定raw_parser()接受字符串的形式：
 *
 * RAW_PARSE_DEFAULT：分析以分号分隔的SQL命令列表，
 * 并返回RawStmt节点的列表。
 *
 * RAW_PARSE_TYPE_NAME：解析一个类型名称，并返回包含
 * TypeName节点的单元素列表。
 *
 * RAW_PARSE_PLPGSQL_EXPR：解析一个PL/pgSQL表达式，并返回
 * 包含RawStmt节点的单元素列表。
 *
 * RAW_PARSE_PLPGSQL_ASSIGNn：解析一个PL/pgSQL赋值语句，
 * 并返回包含RawStmt节点的单元素列表。"n"给出由点名称组成的
 * 目标ColumnRef的数量。
 */
typedef enum
{
	RAW_PARSE_DEFAULT = 0,
	RAW_PARSE_TYPE_NAME,
	RAW_PARSE_PLPGSQL_EXPR,
	RAW_PARSE_PLPGSQL_ASSIGN1,
	RAW_PARSE_PLPGSQL_ASSIGN2,
	RAW_PARSE_PLPGSQL_ASSIGN3
} RawParseMode;

/* backslash_quote GUC的值 */
typedef enum
{
	BACKSLASH_QUOTE_OFF,
	BACKSLASH_QUOTE_ON,
	BACKSLASH_QUOTE_SAFE_ENCODING
}			BackslashQuoteType;

/* scan.l中的GUC变量（这些都是个坏主意 :-() */
extern PGDLLIMPORT int backslash_quote;
extern PGDLLIMPORT bool escape_string_warning;
extern PGDLLIMPORT bool standard_conforming_strings;


/* raw解析函数的主要入口点 */
extern List *raw_parser(const char *str, RawParseMode mode);

/* gram.y导出的实用函数（也许这些应该在其他地方） */
extern List *SystemFuncName(char *name);
extern TypeName *SystemTypeName(char *name);

#endif							/* PARSER_H */
